# https://raw.githubusercontent.com/freebsd/freebsd-src/main/.clang-format
# ColumnLimit: 80->95
# del AlwaysBreakAfterReturnType: TopLevelDefinitions
# BreakBeforeBraces: WebKit -> Attach
# Basic .clang-format
---
BasedOnStyle: WebKit
AlignAfterOpenBracket: DontAlign
AlignConsecutiveMacros: AcrossEmptyLines
AlignConsecutiveAssignments: false
AlignConsecutiveDeclarations: false
AlignEscapedNewlines: Left
AlignOperands: false
AlignTrailingComments: true
AllowAllArgumentsOnNextLine: false
AllowAllParametersOfDeclarationOnNextLine: false
AllowShortBlocksOnASingleLine: Never
AllowShortCaseLabelsOnASingleLine: false
AllowShortFunctionsOnASingleLine: InlineOnly
AllowShortIfStatementsOnASingleLine: Never
AllowShortLoopsOnASingleLine: false
#AlwaysBreakAfterReturnType: TopLevelDefinitions
AlwaysBreakBeforeMultilineStrings: false
AlwaysBreakTemplateDeclarations: MultiLine
BinPackArguments: true
BinPackParameters: true
BreakBeforeBinaryOperators: None
BreakBeforeBraces: Attach
BreakBeforeTernaryOperators: false
# TODO: BreakStringLiterals can cause very strange formatting so turn it off?
BreakStringLiterals: false
# Prefer:
# some_var = function(arg1,
#    arg2)
# over:
# some_var =
#     function(arg1, arg2)
PenaltyBreakAssignment: 100
# Prefer:
# some_long_function(arg1, arg2
#     arg3)
# over:
# some_long_function(
#     arg1, arg2, arg3)
PenaltyBreakBeforeFirstCallParameter: 100
CompactNamespaces: true
DerivePointerAlignment: false
DisableFormat: false
ForEachMacros:
  - ARB_ARRFOREACH
  - ARB_ARRFOREACH_REVWCOND
  - ARB_ARRFOREACH_REVERSE
  - ARB_FOREACH
  - ARB_FOREACH_FROM
  - ARB_FOREACH_SAFE
  - ARB_FOREACH_REVERSE
  - ARB_FOREACH_REVERSE_FROM
  - ARB_FOREACH_REVERSE_SAFE
  - BIT_FOREACH_ISCLR
  - BIT_FOREACH_ISSET
  - CPU_FOREACH
  - CPU_FOREACH_ISCLR
  - CPU_FOREACH_ISSET
  - FOREACH_THREAD_IN_PROC
  - FOREACH_PROC_IN_SYSTEM
  - FOREACH_PRISON_CHILD
  - FOREACH_PRISON_DESCENDANT
  - FOREACH_PRISON_DESCENDANT_LOCKED
  - FOREACH_PRISON_DESCENDANT_LOCKED_LEVEL
  - MNT_VNODE_FOREACH_ALL
  - MNT_VNODE_FOREACH_ACTIVE
  - RB_FOREACH
  - RB_FOREACH_FROM
  - RB_FOREACH_SAFE
  - RB_FOREACH_REVERSE
  - RB_FOREACH_REVERSE_FROM
  - RB_FOREACH_REVERSE_SAFE
  - SLIST_FOREACH
  - SLIST_FOREACH_FROM
  - SLIST_FOREACH_FROM_SAFE
  - SLIST_FOREACH_SAFE
  - SLIST_FOREACH_PREVPTR
  - SPLAY_FOREACH
  - LIST_FOREACH
  - LIST_FOREACH_FROM
  - LIST_FOREACH_FROM_SAFE
  - LIST_FOREACH_SAFE
  - STAILQ_FOREACH
  - STAILQ_FOREACH_FROM
  - STAILQ_FOREACH_FROM_SAFE
  - STAILQ_FOREACH_SAFE
  - TAILQ_FOREACH
  - TAILQ_FOREACH_FROM
  - TAILQ_FOREACH_FROM_SAFE
  - TAILQ_FOREACH_REVERSE
  - TAILQ_FOREACH_REVERSE_FROM
  - TAILQ_FOREACH_REVERSE_FROM_SAFE
  - TAILQ_FOREACH_REVERSE_SAFE
  - TAILQ_FOREACH_SAFE
  - VM_MAP_ENTRY_FOREACH
  - VM_PAGE_DUMP_FOREACH
SpaceBeforeParens: ControlStatementsExceptForEachMacros
IndentCaseLabels: false
IndentPPDirectives: None
Language: Cpp
NamespaceIndentation: None
PointerAlignment: Right
ContinuationIndentWidth: 4
IndentWidth: 8
TabWidth: 8
ColumnLimit: 95
UseTab: Always
SpaceAfterCStyleCast: false
IncludeBlocks: Regroup
IncludeCategories:
  - Regex: '^\"opt_.*\.h\"'
    Priority: 1
    SortPriority: 10
  - Regex: '^<sys/cdefs\.h>'
    Priority: 2
    SortPriority: 20
  - Regex: '^<sys/types\.h>'
    Priority: 2
    SortPriority: 21
  - Regex: '^<sys/param\.h>'
    Priority: 2
    SortPriority: 22
  - Regex: '^<sys/systm\.h>'
    Priority: 2
    SortPriority: 23
  - Regex: '^<sys.*/'
    Priority: 2
    SortPriority: 24
  - Regex: '^<vm/vm\.h>'
    Priority: 3
    SortPriority: 30
  - Regex: '^<vm/'
    Priority: 3
    SortPriority: 31
  - Regex: '^<machine/'
    Priority: 4
    SortPriority: 40
  - Regex: '^<(x86|amd64|i386|xen)/'
    Priority: 5
    SortPriority: 50
  - Regex: '^<dev/'
    Priority: 6
    SortPriority: 60
  - Regex: '^<net.*/'
    Priority: 7
    SortPriority: 70
  - Regex: '^<protocols/'
    Priority: 7
    SortPriority: 71
  - Regex: '^<(fs|nfs(|client|server)|ufs)/'
    Priority: 8
    SortPriority: 80
  - Regex: '^<[^/].*\.h'
    Priority: 9
    SortPriority: 90
  - Regex: '^\".*\.h\"'
    Priority: 10
    SortPriority: 100
# LLVM's header include ordering style is almost the exact opposite of ours.
# Unfortunately, they have hard-coded their preferences into clang-format.
# Clobbering this regular expression to avoid matching prevents non-system
# headers from being forcibly moved to the top of the include list.
# http://llvm.org/docs/CodingStandards.html#include-style
IncludeIsMainRegex: 'BLAH_DONT_MATCH_ANYTHING'
SortIncludes: true
KeepEmptyLinesAtTheStartOfBlocks: false
TypenameMacros:
  - ARB_ELMTYPE
  - ARB_HEAD
  - ARB8_HEAD
  - ARB16_HEAD
  - ARB32_HEAD
  - ARB_ENTRY
  - ARB8_ENTRY
  - ARB16_ENTRY
  - ARB32_ENTRY
  - LIST_CLASS_ENTRY
  - LIST_CLASS_HEAD
  - LIST_ENTRY
  - LIST_HEAD
  - QUEUE_TYPEOF
  - RB_ENTRY
  - RB_HEAD
  - SLIST_CLASS_HEAD
  - SLIST_CLASS_ENTRY
  - SLIST_HEAD
  - SLIST_ENTRY
  - SMR_POINTER
  - SPLAY_ENTRY
  - SPLAY_HEAD
  - STAILQ_CLASS_ENTRY
  - STAILQ_CLASS_HEAD
  - STAILQ_ENTRY
  - STAILQ_HEAD
  - TAILQ_CLASS_ENTRY
  - TAILQ_CLASS_HEAD
  - TAILQ_ENTRY
  - TAILQ_HEAD
